package aaaaa;


import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class BloomMain {
    private static final int size = 10000;// 预计要插入的数据

    private static final double fpp = 0.05; // 期望的误判率 5%

    private static final BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, fpp);

    public static void main(String[] args) {
        for (int i = 0; i < size; i++) {
            bloomFilter.put(i);
        }
        int countA = 0;
        // 故意取10000个不在集合内的数，看多少会被认为在这个过滤器里
        for (int i = 0; i < 10000; i++) {
            if (bloomFilter.mightContain(i)) { // 其他元素生成的code
                countA++;
            }
        }

        System.out.println("总共命中了：" + countA);


        int count = 0;
        // 故意取10000个不在集合内的数，看多少会被认为在这个过滤器里
        for (int i = 10000; i < 20000; i++) {
            if (bloomFilter.mightContain(i)) { // 其他元素生成的code
                count++;
                System.out.println("误判了：" + i);
            }
        }

        System.out.println("总共误判了：" + count);
    }
}
// 为什么它叫过滤器，因为一定可以过滤掉重复的数据。

// 布隆过滤器的作用是过滤掉重复的数据
// 重复的一定会过滤掉
// 不重复的可能会过滤掉（与其他数据生成的hash码都相同）

// 判断在不在集合中
// 存在一定能判断出来
// 不存在可能误判为存在
